package com.java.interceptor;



import com.java.secnity.AuthChecher;
import com.java.secnity.Authorrization;
import com.java.secnity.Role;
import com.mysql.jdbc.ExceptionInterceptor;
import org.apache.log4j.LogManager;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

/**
 * 拦截器
 * 先执行preHandle在执行controller
 */
public class AuthInterceptor implements HandlerInterceptor {


    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //拿到将要执行的controller的方法，然后再拿方法上的Authorrization注解value方法中的值，根据值判断是否有权限操作
        //用来判定handler是否和HandlerMethod.class相同或者是其父类
        if(handler.getClass().isAssignableFrom(HandlerMethod.class)){
           //强转成HandlerMethod类型
            HandlerMethod handlerMethod = (HandlerMethod) handler;
           //得到的注解
            Authorrization methodAnnotation = handlerMethod.getMethodAnnotation(Authorrization.class);

            //如果方法上无注解，则去类上找注解
            //查找类上的Authorrization权限注解
            if(methodAnnotation==null){
                //拿到将要执行controller的方法对象   handlerMethod.getMethod()
                Method method = handlerMethod.getMethod();
                //method.getDeclaringClass();通过拿到方法在拿到整个类controller
                Class<?> declaringClass = method.getDeclaringClass();
                //获取controller类上的Authorrization注解
                methodAnnotation= declaringClass.getAnnotation(Authorrization.class);
//                //拿到Authorrization注解的值
//                Role[] value = methodAnnotation.value();
//                System.out.println(value);
            }
            //如果方法和类上都没有Authorrization权限注解，则默认所有人可以访问
            if(methodAnnotation==null){
                return true;
            }
            //如果Authorrization权限注解不为空就拿到执行此方法需要的角色
            Role[] rolevalue=methodAnnotation.value();

            //将注解上的权限放入list中
            List<String> roleList=new ArrayList<String>();

            for(Role role:rolevalue){
              //得到用枚举类型定义的角色名称
                role.name();
                System.out.println(role.name());
                roleList.add(role.name());
            }
            //校验权限信息
            return AuthChecher.check(roleList,request,response);

            //查找方法上的Authorrization权限注解
            //如果methodAnnotation不为空就取出Authorrization权限的值
//            if(methodAnnotation !=null){
//                Role[] rolevalue=methodAnnotation.value();
//                System.out.println(rolevalue);
//            }

        }


        return true;
    }
//
//    // 执行controller方法执行完成时执行此方法，或捕捉异常，会默认执行
////    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
////            throws Exception {
////        System.out.println("afterCompletion()方法");
////    }


}
